/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2008，所有权利保留。
 * 
 * 项目名：	rumba-web
 * 文件名：	SimpleFilter.java
 * 模块说明：	
 * 修改历史：
 * Jun 2, 2008 - zhangyanbo - 创建。
 */
package com.hd123.rumba.gwt.base.client;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

/**
 * 查询筛选器
 * <p>
 * 可以与{@link com.gwtext.client.data.Store}的UrlParam[]进行转换，以便在remote
 * paging时可以传递筛选器。
 * 
 * @author zhangyanbo
 * 
 */
public class QueryFilter implements Serializable {
  
  private static final long serialVersionUID = 300100L;
  
  /** 默认情况下每页显示记录数。 */
  public static final int DEFAULT_PAGE_SIZE = 20;

  /** @gwt.typeArgs <java.lang.String, java.io.Serializable> */
  protected HashMap params = new HashMap();
  /** @gwt.typeArgs <java.lang.String, java.io.Serializable> */
  protected HashMap forceParams = new HashMap();
  /** @gwt.typeArgs <java.lang.String> */
  private List sorts = new ArrayList();
  /** @gwt.typeArgs <java.lang.String> */
  private List dirs = new ArrayList();
  private int page;
  private int pageSize;
  private String sessionId;

  /**
   * 取得参数取值。
   * 
   * @param key
   *            指定参数名。
   * @return
   */
  public Object get(String key) {
    Object value = params.get(key);
    if (value == null)
      value = forceParams.get(key);
    return value;
  }

  /**
   * 设置参数取值。
   * 
   * @param key
   *            指定参数名。
   * @param value
   *            指定参数取值。
   */
  public void put(String key, Object value) {
    params.put(key, value);
  }

  /**
   * 设置固定参数取值。
   * 
   * @param key
   *            指定参数名。
   * @param value
   *            指定参数取值。
   */
  public void putForce(String key, Object value) {
    forceParams.put(key, value);
  }

  /**
   * 删除指定参数，也包括固定参数。
   * 
   * @param key
   *            指定参数名。
   */
  public void remove(String key) {
    if (params.containsKey(key))
      params.remove(key);
    else
      forceParams.remove(key);
  }

  /**
   * 清除参数。但不会清除所有的固定参数。
   */
  public void clear() {
    params.clear();
    this.page = 0;
  }

  /** 参数映射表。 */
  public HashMap getParams() {
    return params;
  }

  /** 固定册书映射表。 */
  public HashMap getForceParams() {
    return forceParams;
  }

  /**
   * 清除所有排序设置。
   */
  public void clearOrders() {
    sorts.clear();
    dirs.clear();
  }

  /**
   * 添加一个排序字段。排序方向为“升序”。
   * 
   * @param sort
   *            指定排序字段名。
   */
  public void appendOrder(String sort) {
    appendOrder(sort, "asc");
  }

  /**
   * 添加一个排序字段。
   * 
   * @param sort
   *            指定排序字段名。
   * @param dir
   *            指定排序方向。
   */
  public void appendOrder(String sort, String dir) {
    sorts.add(sort);
    dirs.add(dir);
  }

  /**
   * 取得所有的排序字段数组。
   * 
   * @return
   */
  public String[] toSortsArray() {
    return (String[]) sorts.toArray(new String[] {});
  }

  /**
   * 取得所有的排序方向数组。
   * 
   * @return
   */
  public String[] toDirsArray() {
    return (String[]) dirs.toArray(new String[] {});
  }

  /** 排序字段名。仅用于只有一个排序字段的情况。 */
  public String getSort() {
    return sorts.size() == 0 ? null : (String) sorts.get(0);
  }

  public void setSort(String sort) {
    if (sorts.size() != 1) {
      clearOrders();
      appendOrder(sort);
    } else {
      sorts.set(0, sort);
    }
  }

  /** 排序方向。仅用于只有一个排序字段的情况。 */
  public String getDirection() {
    return dirs.size() == 0 ? null : (String) dirs.get(0);
  }

  public void setDirection(String direction) {
    if (dirs.size() != 1) {
      clearOrders();
      appendOrder("", direction);
    } else {
      dirs.set(0, direction);
    }
  }

  public int getPage() {
    return page;
  }

  public void setPage(int page) {
    this.page = page;
  }

  public int getPageSize() {
    return pageSize;
  }

  public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
  }
  
  public String getSessionId() {
    return sessionId;
  }
  
  public void setSessionId(String sessionId) {
    this.sessionId = sessionId;
  }

  public void assign(QueryFilter source) {
    this.page = source.getPage();
    this.pageSize = source.getPageSize();

    clearOrders();
    String[] sorts = source.toSortsArray();
    String[] dirs = source.toDirsArray();
    for (int i = 0, n = sorts.length; i < n; i++) {
      String sort = sorts[i];
      String dir = dirs[i];
      appendOrder(sort, dir);
    }

    this.params.clear();
    Iterator keys = source.params.keySet().iterator();
    while (keys.hasNext()) {
      String key = (String) keys.next();
      Object value = source.params.get(key);
      this.params.put(key, value);
    }

    this.forceParams.clear();
    keys = source.forceParams.keySet().iterator();
    while (keys.hasNext()) {
      String key = (String) keys.next();
      Object value = source.forceParams.get(key);
      this.forceParams.put(key, value);
    }
  }

}
